<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /* 
        iterator是一种接口机制，为各种不同的数据结构提供统一的一种访问机制

        iterator遍历的过程：
        （1）创建一个指针对象，指向当前数据结构的起始位置。也就是说，遍历器对象本质上，就是一个指针对象。
        （2）第一次调用指针对象的 next 方法，可以将指针指向数据结构的第一个成员。
        （3）第二次调用指针对象的 next 方法，指针就指向数据结构的第二个成员。
        （4）不断调用指针对象的 next 方法，直到它指向数据结构的结束位置。

        每一次调用 next 方法，都会返回数据结构的当前成员的信息。具体来说，就是返回一个包含 value 和 done 两个属性的对象。其中， value 属性是当前成员的值， done 属性是一个布尔值，表示遍历是否结束
        */
       let arr = ['黑学晨','郭子豪','孙伟','王洋洋'];
       /* function mockIterator(target){
            let index = 0;
            return {
                next(){
                    return index < target.length ? {
                        value:target[index++],
                        done:false
                    } :{
                        value:target[index++],
                        done:true
                    }
                }
            }
       }
       let zhizhen = mockIterator(arr);
       console.log(zhizhen.next());
       console.log(zhizhen.next());
       console.log(zhizhen.next());
       console.log(zhizhen.next());
       console.log(zhizhen.next()); */


      /*  function mockIterator(){
           let that = this;
           console.log(that);
            let index = 0;
            return {
                next(){
                    return index < that.length ? {
                        value:that[index++],
                        done:false
                    } :{
                        value:that[index++],
                        done:true
                    }
                }
            }
       }
       console.log(arr);
       Array.prototype[Symbol.iterator] = mockIterator;
       console.log(arr);
       for(let item of arr){
           console.log(item);
       } */


    //封装一个即能遍历数组又能遍历对象的iterator接口供for of使用
    function mockIterator(){
        let that = this;
        let index = 0;
        // 先去判断this 是数组还是对象
        if(Array.isArray(that)){
            return {
                next(){
                    return index < that.length ? {
                        value:that[index++],
                        done:false
                    } :{
                        value:that[index++],
                        done:true
                    }
                }
            }
        }else{
            // 对象
            let keys = Object.keys(that);
            return {
                next(){
                    return index < keys.length ? {
                        value:that[keys[index++]],
                        done:false
                    } : {
                        value:that[keys[index++]],
                        done:true
                    }
                }
            }
        }
    } 
    Array.prototype[Symbol.iterator] = mockIterator;
    Object.prototype[Symbol.iterator] = mockIterator;
    console.log(arr);
    let obj = {
        name:'tom',
        age:18
        }
    console.log(obj);
    for(let item of arr){
        console.log(item);
    }    
    for(let item of obj){
        console.log(item);
    }
    </script>
</body>
</html>